package com.gao.volatiletest;

import java.util.concurrent.atomic.AtomicInteger;

//volatile 不保证原子性
public class Demo02 {
//    你加上没啥用 volatile 不能保证原子性

//    原子类的Integer
    private volatile static AtomicInteger num = new AtomicInteger();
    public  static void add(){
//        AtomicInteger ++ 方法，CAS
        num.getAndIncrement();
    }

    public static void main(String[] args) {

//        num理论上应该为20k
        for (int i = 1; i <= 20 ; i++) {
            new Thread(() -> {
                for (int j = 1; j <= 1000 ; j++) {
                    add();
                }

            }).start();
        }

//        默认main和GC线程
        while (Thread.activeCount() > 2) {
            Thread.yield();
        }

        System.out.println(Thread.currentThread().getName() + " " + num);

//        如果不加lock跟synchronized,怎么保证原子性？
//        采用原子类，节省lock与synchronized带来的性能损耗
//        这些类的底层都直接和操作系统挂钩，在内存里修改值，unsafe类是一个很特殊的存在！

    }

}
